#ifndef __PUBLIC_H__
#define __PUBLIC_H__
#include <stdatomic.h>
#include "file_tool.h"

#define LOG(_fmt, ...) fprintf(stdout, "[%s:%d]: "_fmt, __FILE__, __LINE__, ##__VA_ARGS__)


// =================== 全局结构体 =======================
struct RBTree;
typedef struct RBTree RBTree;

struct SkipList;
typedef struct SkipList SkipList;

struct HashTable;
typedef struct HashTable HashTable;

struct AOFAsyncWriter;
extern struct AOFAsyncWriter* global_aof_writer; // 全局异步日志写入器，用于各引擎更新日志（所有引擎日志写入同一份日志文件
#define FSYNC_INTERVAL_TIME 3000 // 异步写入器刷盘的间隔时间（ms）


// ===================== 文件名配置 ===================
#define RB_FULL_FILE_NAME  "rbtree_full.bin" 
#define HASH_FULL_FILE_NAME "hash_table_full.bin"
#define SKIPLIST_FULL_FILE_NALE "skiplist_full_bin"


#define AOF_FILE_NAME "aof.log"
#define AOF_BACKUP_FILE_NAME "aof.bak"

// ===================== 内存配置 =====================
#define SHOW_JEMALLOC_USE_STATS 0 // 程序结束时展示jemalloc对内存使用情况的统计

void* kvs_malloc(size_t size);
void kvs_free(void* ptr);


// ===================== 网络框架选择 =====================
#define REACTOR 0
#define PROACTOR 1
#define NTY_SERVER 2
#define SERVER REACTOR

// ===================== 引擎开启配置 =====================
#define RBTREE_ENGINE_ENABLE 1
#define HASH_ENGINE_ENABLE 1
#define SKIPLIST_ENGINE_ENABLE 1


// ===================== 网络模式 =======================
#define SINGLE_HOST_FULL 0 // 单主机全量模式
#define SINGLE_HOST_AOF 0 // 单主机增量模式

#define MASTER_SLAVE 1 // 主从同步需开启
#define MASTER 1 // 主机模式
#define SLAVE 0 //  从机模式
#define SLAVE_START_SYNC_BACKUP_ENGINES 0 // 从机启动备份引擎，专门用于同步主机，减少与客户端竞争锁。（只需将备份引擎跟对外引擎做个简单指针置换，对锁的占用时间几乎为0）



#define FOR_CLIENT_PORT 8000
#define SLAVE_SYNC_PORT 8001 // 主从同步端口（与客户端端口8000区分）


#if MASTER_SLAVE
    extern _Atomic(off_t) aof_file_sync_length; // 主机用于检测日志文件是否变化，实时同步从机
#endif

// =================基于网络模式不同的配置==============
#if SINGLE_HOST_FULL
#define FULL_PERSIST 1 // 全量持久化开启
#define INIT_BY_FULL 1 // 初始时用全量文件初始化
#define STORE_FULL 1    // 结束时遍历保存全量文件
#define BACK_UP_OLD_FULL_PERSIST_FILE 0  // 保存全量文件前对上一份进行备份

#define INIT_BY_AOF 0 // 初始时用增量文件初始化（如果开启全量初始化，则在全量初始化之后调用）
#define AOF_PERSIST 0// 实时记录日志（开启异步写入器）： 单主机模式：开启qps: 52856, 不开启qps: 54981
#define AOF_CLEAR 1 // 结束时删除日志


#define RB_TREE_MUTEX_LOCK 0  // 互斥锁开关
#define RB_TREE_RW_LOCK    0  // 读写锁开关（与互斥锁二选一或都关闭）

#define HASH_TABLE_MUTEX_LOCK 0
#define HASH_TABLE_RW_LOCK 0

#define SKIPLIST_MUTEX_LOCK 0
#define SKIPLIST_RW_LOCK 0

#elif SINGLE_HOST_AOF
#define FULL_PERSIST 0 
#define INIT_BY_FULL 0 
#define STORE_FULL 0    
#define BACK_UP_OLD_FULL_PERSIST_FILE 0  
#define INIT_BY_AOF 1 
#define AOF_PERSIST 1
#define AOF_CLEAR 0


#define RB_TREE_MUTEX_LOCK 0  // 互斥锁开关
#define RB_TREE_RW_LOCK    0  // 读写锁开关（与互斥锁二选一或都关闭）

#define HASH_TABLE_MUTEX_LOCK 0
#define HASH_TABLE_RW_LOCK 0

#define SKIPLIST_MUTEX_LOCK 0
#define SKIPLIST_RW_LOCK 0


#elif MASTER
#define FULL_PERSIST  1
#define INIT_BY_FULL 1
#define BACK_UP_OLD_FULL_PERSIST_FILE 0
#define STORE_FULL 1
#define INIT_BY_AOF 0
#define AOF_PERSIST 1 // 增量文件用于实时主从同步
#define AOF_CLEAR 1 // 主机关闭时日志删除


#define RB_TREE_MUTEX_LOCK 0  
#define RB_TREE_RW_LOCK    0  

#define HASH_TABLE_MUTEX_LOCK 0
#define HASH_TABLE_RW_LOCK 0

#define SKIPLIST_MUTEX_LOCK 0
#define SKIPLIST_RW_LOCK 0

#elif SLAVE
#define FULL_PERSIST 1  
#define INIT_BY_FULL 1 // 全量文件来源于首次连接主机
#define BACK_UP_OLD_FULL_PERSIST_FILE 0
#define STORE_FULL 0 // 从机关闭时不重写全量文件
#define INIT_BY_AOF 1 // 主机同步时实时更新日志，从机关闭重启时需采用全量+增量的初始化方式
#define AOF_PERSIST 1
#define AOF_CLEAR 0


#define RB_TREE_MUTEX_LOCK 1  // 互斥锁开关
#define RB_TREE_RW_LOCK    0  // 读写锁开关（与互斥锁二选一或都关闭）

#define HASH_TABLE_MUTEX_LOCK 1
#define HASH_TABLE_RW_LOCK 0

#define SKIPLIST_MUTEX_LOCK 1
#define SKIPLIST_RW_LOCK 0

#endif



#endif
